<?php
namespace app\common;

use think\facade\Db;
use think\facade\Request;

/**
 * Token验证公共类
 * 统一处理多设备登录的token验证逻辑
 */
class TokenAuth
{
    /**
     * 验证token并返回用户信息
     * @return array|false 返回用户信息或false
     */
    public static function getUserByToken()
    {
        // 从请求头获取token
        $token = Request::header('Authorization');
        if (empty($token)) {
            return false;
        }
        
        // 去掉 Bearer 前缀
        $token = str_replace('Bearer ', '', $token);
        
        // 从tokens表查询token信息
        $tokenInfo = Db::name('user_tokens')
            ->where('token', $token)
            ->where('status', 1)
            ->find();
            
        if (!$tokenInfo) {
            return false;
        }
        
        // 检查token是否过期
        if ($tokenInfo['expires_at'] && strtotime($tokenInfo['expires_at']) < time()) {
            // 删除过期token
            Db::name('user_tokens')
                ->where('id', $tokenInfo['id'])
                ->delete();
            return false;
        }
        
        // 更新最后活跃时间并延长有效期48小时
        $newExpiresAt = date('Y-m-d H:i:s', time() + 48 * 3600);
        Db::name('user_tokens')
            ->where('id', $tokenInfo['id'])
            ->update([
                'last_active_time' => date('Y-m-d H:i:s'),
                'expires_at' => $newExpiresAt
            ]);
        
        // 根据user_id查询用户基本信息
        $user = Db::name('user')
            ->where('id', $tokenInfo['user_id'])
            ->where('status', 1)
            ->find();
            
        return $user ?: false;
    }
    
    /**
     * 验证token并返回JSON响应（用于API接口）
     * @return array|null 如果验证失败返回错误响应，成功返回null
     */
    public static function checkTokenForApi()
    {
        $user = self::getUserByToken();
        
        if (!$user) {
            return ['code' => 401, 'msg' => '未登录或token已过期'];
        }
        
        return null; // 验证成功返回null
    }
}
